#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>     // POSIX API（close、write等）

/**
 * 初始化串口（适配DL-30无线模块）
 * 返回值：串口文件描述符（成功），-1（失败）
 */
int uart_init() {
    // 打开USB转TTL对应的串口设备（/dev/ttyUSB0）
    // O_RDWR：读写模式；O_NOCTTY：不将设备作为控制终端；O_NDELAY：非阻塞模式
    int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd < 0) {
        printf("串口打开失败，请检查/dev/ttyUSB0是否存在");
        return -1;
    }

    // 配置串口参数
    struct termios opt;
    tcgetattr(fd, &opt);  // 获取当前串口配置

    // 设置波特率为115200（与STM32、DL-30保持一致）
    cfsetispeed(&opt, B115200);  // 输入波特率
    cfsetospeed(&opt, B115200);  // 输出波特率

    // 配置数据格式：8位数据位，无校验位，1位停止位
    opt.c_cflag |= (CLOCAL | CREAD);  // CLOCAL：忽略调制解调器控制线；CREAD：启用接收
    opt.c_cflag &= ~CSIZE;           // 清除数据位设置
    opt.c_cflag |= CS8;              // 设置8位数据位
    opt.c_cflag &= ~PARENB;          // 无校验位
    opt.c_cflag &= ~CSTOPB;          // 1位停止位（默认）
    opt.c_cflag &= ~CRTSCTS;         // 禁用硬件流控制

    // 应用配置（TCSANOW：立即生效）
    tcsetattr(fd, TCSANOW, &opt);
    return fd;
}

/**
 * 向STM32发送命令并接收响应
 * 参数：uart_fd（串口文件描述符），cmd（要发送的命令）
 * 返回值：STM32的响应字符串
 */
char* send_to_stm32(int uart_fd, const char* json_str) {
    static char resp[128] = {0};
    memset(resp, 0, sizeof(resp));

    // 添加换行符作为结束符
    char full_cmd[256];
    snprintf(full_cmd, sizeof(full_cmd), "%s\n", json_str);

    // 写入串口
    write(uart_fd, full_cmd, strlen(full_cmd));

    // 等待STM32响应
    usleep(100000);
    read(uart_fd, resp, sizeof(resp) - 1);

    return resp;
}


int main() {
    // 必须先输出HTTP响应头
    printf("Content-Type: text/plain\n\n");

    // 读取POST数据（表单格式：status=true&brightness=50）
    char post_data[100] = {0};
    fgets(post_data, sizeof(post_data), stdin);  // 从标准输入读取参数

 // 解析POST数据
    // 格式示例：device_id=1&action=1&degree=100
    int device_id = 0;
    int action = 0;
    int degree = 0;
    sscanf(post_data, "device_id=%d&action=%d&degree=%d", &device_id, &action, &degree);

    printf("收到参数：device_id=%d, action=%d, degree=%d\n", device_id, action, degree);

    // 初始化串口
    int uart_fd = uart_init();
    if (uart_fd < 0) {
        return 0;
    }

    // 构建JSON数据
    char json_cmd[128];
    snprintf(json_cmd, sizeof(json_cmd),
             "{\"device_id\":%d,\"action\":%d,\"degree\":%d}",
             device_id, action, degree);

    // 发送到STM32
    char* stm32_resp = send_to_stm32(uart_fd, json_cmd);

    // 关闭串口
    close(uart_fd);

    // 输出响应
    printf("%s", stm32_resp);
    return 0;
}
